package com.cloudcc.mobile.util;

import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import com.cloudcc.cloudframe.util.LogUtils;

/**
 * 加密解密
 */

public class AESUtils {
	/**
	 * 加密
	 * 
	 * @param key
	 *            密钥
	 * @param src
	 *            加密字符
	 * @return 经过加密的字符串
	 * @throws Exception
	 */
	public static String encrypt(String key, String src) throws Exception {
		byte[] rawKey = getRawKey(key.getBytes());
		byte[] result = encrypt(rawKey, src.getBytes());
		return toHex(result);
	}

	/**
	 * 解密
	 * 
	 * @param key
	 *            密钥
	 * @param encrypted
	 *            加密后的字符
	 * @return 加密前源字符
	 * @throws Exception
	 */
	public static String decrypt(String key, String encrypted) throws Exception {
		byte[] rawKey = getRawKey(key.getBytes());
		byte[] enc = toByte(encrypted);
		byte[] result = decrypt(rawKey, enc);
		return new String(result);
	}

	private static byte[] getRawKey(byte[] seed) throws Exception {
//		KeyGenerator kgen = KeyGenerator.getInstance("AES");
//		// SHA1PRNG 强随机种子算法, 要区别4.2以上版本的调用方法
//		SecureRandom sr = null;
//
//		if (android.os.Build.VERSION.SDK_INT >= 24)
//		{
//			sr = SecureRandom.getInstance("SHA1PRNG", new CryptoProvider());
//		}
//		else if (android.os.Build.VERSION.SDK_INT >= 17) {
//			sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");
//		} else {
//			sr = SecureRandom.getInstance("SHA1PRNG");
//		}
//		sr.setSeed(seed);
//		kgen.init(256, sr); // 256 bits or 128 bits,192bits
//		SecretKey skey = kgen.generateKey();
//		byte[] raw = skey.getEncoded();
//		return raw;
		byte[] rawKey = rawKey = InsecureSHA1PRNGKeyDerivator.deriveInsecureKey(seed, 32);
		return rawKey;
	}

	private static byte[] encrypt(byte[] key, byte[] src) throws Exception {
		SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
		Cipher cipher = Cipher.getInstance("AES");
		cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
		byte[] encrypted = cipher.doFinal(src);
		return encrypted;
	}

	private static byte[] decrypt(byte[] key, byte[] encrypted)
			throws Exception {
		SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
		Cipher cipher = Cipher.getInstance("AES");
		cipher.init(Cipher.DECRYPT_MODE, skeySpec);
		byte[] decrypted = cipher.doFinal(encrypted);
		return decrypted;
	}

	public static String toHex(String txt) {
		return toHex(txt.getBytes());
	}

	public static String fromHex(String hex) {
		return new String(toByte(hex));
	}

	public static byte[] toByte(String hexString) {
		int len = hexString.length() / 2;
		byte[] result = new byte[len];
		for (int i = 0; i < len; i++)
			result[i] = Integer.valueOf(hexString.substring(2 * i, 2 * i + 2),
					16).byteValue();
		return result;
	}

	public static String toHex(byte[] buf) {
		if (buf == null)
			return "";
		StringBuffer result = new StringBuffer(2 * buf.length);
		for (int i = 0; i < buf.length; i++) {
			appendHex(result, buf[i]);
		}
		return result.toString();
	}

	private final static String HEX = "0123456789ABCDEF";

	private static void appendHex(StringBuffer sb, byte b) {
		sb.append(HEX.charAt((b >> 4) & 0x0f)).append(HEX.charAt(b & 0x0f));
	}

	/**
	 * 根据密文密码 获得 明文密码
	 * 
	 * @param enPassword
	 * @return
	 */
	public static String getDePassword(String enPassword) {
		try {
			String decrypt = decrypt(Tools.getpassword(), enPassword);
			return decrypt;
		} catch (Exception e) {
			LogUtils.d("app", "解密失败" + enPassword);
			return "";
		}
	}
}